<?php
namespace app\common\job;
use think\queue\Job;

use service\WechatTemplateService;

/**
 * 消息提醒
 */
class Message {
    /**
     * fire方法是消息队列默认调用的方法
     * @param Job            $job      当前的任务对象
     * @param array|mixed    $data     发布任务时自定义的数据
     */
    public function fire(Job $job,$data)
    {
        // 有些消息在到达消费者时,可能已经不再需要执行了
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        $isJobDone = $this->doJob($data);

        if ($isJobDone) {
            // 如果任务执行成功， 记得删除任务
            $job->delete();
            print("<info>Hello Job has been done and deleted"."</info>\n");
        }else{
            if ($job->attempts() > 3) {
                //通过这个方法可以检查这个任务已经重试了几次了
                print("<warn>Hello Job has been retried more than 3 times!"."</warn>\n");

				        $job->delete();

                // 也可以重新发布这个任务
                //print("<info>Hello Job will be availabe again after 2s."."</info>\n");
                //$job->release(2); //$delay为延迟时间，表示该任务延迟2秒后再执行
            }
        }
    }

    /**
     * 有些消息在到达消费者时,可能已经不再需要执行了
     * @param array|mixed    $data     发布任务时自定义的数据
     * @return boolean                 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data){
        return true;
    }

    /**
     * 根据消息中的数据进行实际的业务处理...
     */
    private function doJob($data)
    {
        if ( $data['type'] == 'wechat' ) {
            $main = $this->wechatMessage($data['to'] , $data['tempId'], $data['bizData'], $data['url'] );

            if ( $main !== false ) {
                /** 回调处理 */
                if ( isset($data['callback']) ) {
                    if ( is_array($data['callback']) ) {
                        $class   = $data['callback'][0] ?? '';
                        $method  = $data['callback'][0] ?? '';

                        if ( $class && $method ) {
                            try {
                                $obj = new $class;
                                $obj->$method($data['extraData']);
                            } catch ( \Exception $e ) {
                                return false;
                            }
                        }
                    }

                    if ( is_string($data['callback']) ) {
                        try {
                            call_user_func($data['callback'] , $data['extraData']);
                        }  catch ( \Exception $e ) {
                            return false;
                        }
                    }
                }

                return true;
            }
        }

        return false;
    }

    /**
     * [wechatMessage description]
     * @Author   FW
     * @DateTime 2020-12-22
     * @Email    123763712@qq.com
     * @param    [type]           $to      [description]
     * @param    [type]           $tempId  [description]
     * @param    [type]           $bizData [description]
     * @param    [type]           $url     [description]
     * @return   [type]                    [description]
     */
    private function wechatMessage ($to,$tempId,$bizData,$url)
    {
        \service\WechatTemplateService::sendTemplate($to,$tempId,$bizData,$url);
        return true;
    }
}